package com.haoran.dwz.common.threadpool;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * <pre>
 * <ul>
 * <li>corePoolSize：核心池的大小，在创建了线程池后，默认情况下，线程池中并没有任何线程，
 * 	而是等待有任务到来才创建线程去执行任务，当有任务来之后，就会创建一个线程去执行任务，当线程池中的线程数目达到</li>
 * <li>corePoolSize后，就会把到达的任务放到缓存队列当中；</li>
 * <li>maximumPoolSize：线程池最大线程数； </li>
 * <li>keepAliveTime：表示线程没有任务执行时最多保持多久时间会终止；</li>
 * <li>unit：参数keepAliveTime的时间单位（DAYS、HOURS、MINUTES、SECONDS 等）；</li>
 * <li>workQueue：阻塞队列，用来存储等待执行的任务； 
 * 		<ul>
 * 		<li>ArrayBlockingQueue （有界队列）</li>
 * 		<li>LinkedBlockingQueue（无界队列）</li>
 * 		<li>SynchronousQueue</li>
 * 		</ul>
 * <li>threadFactory：线程工厂，主要用来创建线程 </li>
 * 
 * <li>handler：拒绝处理任务的策略
 * 		<ul>
 * 		<li>AbortPolicy：丢弃任务并抛出 RejectedExecutionException 异常。（默认这种）</li>
 *		<li>DiscardPolicy：也是丢弃任务，但是不抛出异常 DiscardOldestPolicy：丢弃队列最前面的任务，然后重新尝试执行任务（重复此过程）</li>
 *		<li>CallerRunsPolicy：由调用线程处理该任务</li>
 *		</ul>
 * </li>
 *</ul>
 * </pre>
 */
public class ThreadPool {
	public static void main(String[] args) {
		// 核心线程数量为 2，最大线程数量 4，空闲线程存活的时间 60s，有界队列长度为 3,
		ThreadPoolExecutor pool = new ThreadPoolExecutor(2, 4, 60, TimeUnit.SECONDS, new ArrayBlockingQueue<>(3));

		// 核心线程数量为 2，最大线程数量 4，空闲线程存活的时间 60s， 无界队列,
		// ThreadPoolExecutor pool = new ThreadPoolExecutor(2, 4, 60L, TimeUnit.SECONDS,
		// new LinkedBlockingDeque<>());

		// 核心线程数量为 2，最大线程数量 4，空闲线程存活的时间 60s，有界队列长度为 3, 使用自定义拒绝策略
		// ThreadPoolExecutor pool = new ThreadPoolExecutor(2, 4, 60, TimeUnit.SECONDS,
		// new ArrayBlockingQueue<Runnable>(3), new RejectedThreadPoolHandler());

		for (int i = 1; i <= 10; i++) {
			// 创建 10 个任务
			MyTask task = new MyTask(i, "任务" + i);
			// 运行
			pool.execute(task);
			System.out.println("活跃的线程数：" + pool.getActiveCount() + ",核心线程数：" + pool.getCorePoolSize() + ",线程池大小："
					+ pool.getPoolSize() + ",队列的大小" + pool.getQueue().size());
		}

		// 关闭线程池
		pool.shutdown();
	}
}